# In[1]:
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

import simpy

# In[2]:
from pylab import mpl
# 指定默认字体：解决plot不能显示中文问题
mpl.rcParams['font.sans-serif'] = ['SimHei'] 
# 解决保存图像是负号'-'显示为方块的问题
mpl.rcParams['axes.unicode_minus'] = False 

# In[3]:
from AirportSimulator import *
from Airplane import *

# In[4]:
df = pd.read_csv('./data/domestic_airlines.csv')
chosen_data = df[
        (
            df['周二班期'] == '周二有班期'
            ) & (
            df['降落机场'] == '周水子机场'
        )
    ]

# In[5]:
filtered_data = chosen_data[
        [
            '出发城市', 
            '里程（公里）', 
            '航班班次', 
            '航空公司', 
            '机型', 
            '降落时间', 
            '起飞机场', 
            '降落机场',
            ]
        ]

# In[6]:
"""
...
涉及到飞机的 OOOI 逻辑，信号是通过ACARS自动发送的，
也就是利用飞机的停留刹车传感器、
空地临近电门等传感器的实时信号产生的。

实际起飞时间：

飞机主轮离地、由于主起落架减震支柱不再受到飞机的重力而伸出的瞬间。

实际降落时间：

飞机主轮接触地面、由于主起落架减震支柱受到飞机的重力而压缩的瞬间。

https://www.zhihu.com/question/64808321/answer/963410986
"""

flight_table = pd.DataFrame(
        columns=[
            'name', 
            'from_city', 
            'from_airport', 
            'flight_miles', 
            'arrival_time', 
            'airline_company',
            'aircraft_model'])

# In[7]:
flight_table['name'] = filtered_data['航班班次']
flight_table['from_city'] = filtered_data['出发城市']
flight_table['from_airport'] = filtered_data['起飞机场']
flight_table['flight_miles'] = filtered_data['里程（公里）']
flight_table['arrival_time'] = pd.to_datetime(
    filtered_data['降落时间'], format='%H:%M'
    ).dt.time
flight_table['airline_company'] = filtered_data['航空公司']
flight_table['aircraft_model'] = filtered_data['机型']
flight_table = flight_table.sort_values(
        by='arrival_time'
        )
flight_table = flight_table.reset_index()

# In[8]:
NUM_RUNWAY = 1
NUM_PARKING_BAY = 40
NUM_GROUND_SERVICE_GROUP = 35

# In[9]:
env = simpy.Environment()
simAirPort = AirportSimulator(
    env, flight_table=flight_table,
    num_runways=NUM_RUNWAY,
    num_parking_bays=NUM_PARKING_BAY,
    num_ground_services_groups=NUM_GROUND_SERVICE_GROUP
)

# In[10]:
env.run()

# In[11]:
res_data = simAirPort.result[
    [
        'arrival_time', 
        'takeoff_time',
        'stay_time' 
        ]]
res_data

# In[12]:
hourly_avg = res_data.groupby(
    res_data['arrival_time'].dt.hour
    )['stay_time'].mean()

fig, ax = plt.subplots(dpi=300)
sns.barplot(
    x=hourly_avg.index, 
    y=hourly_avg.values,
    ax=ax
)
ax.set_title('周二 24 小时内各时段航班平均滞留时间统计图')
ax.set_xlabel('时段（60分钟）')
ax.set_ylabel('平均滞留时间')

# In[13]:
res_data['stay_time'].mean()